package trade;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 * Classe de exemplos da técnica de testes de Classes de Equivalência em cima
 * da classe Negocio
 *
 * @author Leo
 */
public class NegocioTestClasseEquivalencia {
    
    public NegocioTestClasseEquivalencia(){
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of buy transaction Ok.
     */
    @Test
    public void testBuyOK() {
        String acao = "A";
        Integer quantidade = 10;
        Negocio negocio = new Negocio();
        
        try {
            negocio.compra(acao, quantidade);
            assertTrue(negocio.contemAcao(acao));
            assertEquals(quantidade, negocio.quantidadeAcao(acao));
        } catch (NegocioException ex) {
            fail(ex.getMessage());
        }
    }

    /**
     * Teste da transação de compra com uma ação inválida.
     */
    @Test
    public void testBuyInvalidSymbol() {
        String acao = "C";
        Integer quantidade = 20;
        Negocio negocio = new Negocio();
        
        try {
            negocio.compra(acao, quantidade);
            fail();
        } catch (NegocioException ex) {
            assertTrue(ex.getMessage().contains("Símbolo"));
            assertFalse(negocio.contemAcao(acao));
        }
    }

    /**
     * Teste da transação de compra com uma quantidade de ações inválida.
     */
    @Test
    public void testBuyInvalidQuantity() {
        String acao = "AA";
        Integer quantidade = -5;
        Negocio negocio = new Negocio();
        
        try {
            negocio.compra(acao, quantidade);
            fail();
        } catch (NegocioException ex) {
            assertTrue(ex.getMessage().contains("Quantidade"));
            assertFalse(negocio.contemAcao(acao));
        }
    }

    /**
     * Test da transação de venda válida.
     */
    @Test
    public void testSellOK() {
        String acao = "ELON";
        Integer quantidadeCompra = 20;
        Integer quantidadeVenda = 10;
        Negocio negocio = new Negocio();

        try {
            negocio.compra(acao, quantidadeCompra);
            negocio.vende(acao, quantidadeVenda);
            assertTrue(negocio.contemAcao(acao));
            Integer quantidadeRestante = quantidadeCompra - quantidadeVenda;
            assertEquals(quantidadeRestante, negocio.quantidadeAcao(acao));
        } catch (NegocioException ex) {
            fail(ex.getMessage());
        }
    }

    /**
     * Teste da transação de venda com uma ação inválida.
     */
    @Test
    public void testSellInvalidSymbol() {
        String acao = "BOB";
        Integer quantidade = 33;
        Negocio negocio = new Negocio();
        
        try {
            negocio.vende(acao, quantidade);
            fail();
        } catch (NegocioException ex) {
            assertTrue(ex.getMessage().contains("Símbolo"));
            assertFalse(negocio.contemAcao(acao));
        }
    }

    /**
     * Teste da transação de venda com uma quantidade de ações inválida.
     */
    @Test
    public void testSellInvalidQuantity() {
        String acao = "ELON";
        Integer quantidade = -3;
        Negocio negocio = new Negocio();

        try {
            negocio.vende(acao, quantidade);
            fail();
        } catch (NegocioException ex) {
            assertTrue(ex.getMessage().contains("Quantidade"));
            assertFalse(negocio.contemAcao(acao));
        }
    }
}